﻿//AcademicPlanner - course registration planning web app.
//Copyright (C) 2009  Boubacar Diallo

//This program is free software; you can redistribute it and/or
//modify it under the terms of the GNU General Public License
//as published by the Free Software Foundation; either version 2
//of the License, or (at your option) any later version.

//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//GNU General Public License for more details.

//You should have received a copy of the GNU General Public License
//along with this program; if not, write to the Free Software
//Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AcademicPlanner.Data;
using AcademicPlanner.Data.Entities;
using AcademicPlanner.Data.Repositories;

namespace AcademicPlanner.Domain.Models.Collections
{
	/// <summary>
	/// PlannerCollection represents a collection of <c>Planner</c>s.
	/// </summary>
	/// <since>1.0</since>
	public class PlannerCollection : ModelCollection<Planner, PlannerEntityRepository, PlannerEntity>
	{
		/// <summary>
		/// Gets the data layer repository of the underlying <c>PlannerEntity</c>s of this collection's <c>Planner</c>s.
		/// </summary>
		/// <since>1.0</since>
		protected override PlannerEntityRepository EntityRepo { get { return DomainMaster.DSAS.PlannerEntityRepo; } }


		internal PlannerCollection()
			: base()
		{

		}

		/// <summary>
		/// Gets the <c>Planner</c> within the application's persistence
		/// whose <c>User</c> has the provided username.
		/// </summary>
		/// <param name="pUserName">The username.</param>
		/// <returns>The <c>Planner</c> or <c>null</c>.</returns>
		/// <exception cref="T:AcademicPlanner.Domain.CriticalDomainException">
		/// Thrown with error code <c>DomainErrorCode.M_PLANNER_ENTITY_RETRIEVAL_BY_USER_NAME_FAILURE</c> 
		/// when a <see cref="T:AcademicPlanner.Data.DataException"/> occurs;
		/// the <see cref="T:AcademicPlanner.Data.DataException"/> is accessible through the
		/// <c>InnerException</c> property.
		/// </exception>
		/// <since>1.0</since>
		public Planner WithUserName(string pUserName)
		{
			Planner rMod = null;
			PlannerEntity vEnt = null;

			try
			{
				vEnt = EntityRepo.FindByUserName(pUserName);
			}
			catch (DataException vDx)
			{
				var vCx = new CriticalDomainException(DomainErrorCode.M_PLANNER_ENTITY_RETRIEVAL_BY_USER_NAME_FAILURE, vDx);
				throw vCx;
			}

			if (vEnt != null)
				rMod = DomainMaster.ModelsFountain.GetPlanner(vEnt);

			return rMod;
		}
	}
}
